package com.hospital.hospitalserver.util;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 项目订单编号生成工具类
 * 规则：OD + 日期时间 + 8位序列号
 * 示例：OD20251107100300000001
 */
public class generateOrderNo {

    // 订单前缀
    private static final String ORDER_PREFIX = "OD";

    // 日期时间格式
    private static final DateTimeFormatter DATE_TIME_FORMATTER =
            DateTimeFormatter.ofPattern("yyyyMMddHHmm");

    // 序列号格式化（8位数字）
    private static final String SEQUENCE_FORMAT = "%08d";

    // 序列号（使用AtomicInteger保证线程安全）
    private static final AtomicInteger SEQUENCE = new AtomicInteger(0);

    // 随机数生成器
    private static final Random RANDOM = new Random();

    // 最大序列号
    private static final int MAX_SEQUENCE = 99999999;

    // 上次生成日期（用于判断是否需要重置序列号）
    private static String lastGenerateDate = "";

    /**
     * 生成订单编号
     * @return 订单编号，格式：OD + 日期时间(12位) + 序列号(8位)
     */
    public static synchronized String generateOrderNo() {
        // 获取当前日期时间
        LocalDateTime now = LocalDateTime.now();
        String currentDate = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));

        // 如果日期变化，重置序列号
        if (!currentDate.equals(lastGenerateDate)) {
            SEQUENCE.set(0);
            lastGenerateDate = currentDate;
        }

        // 生成序列号（如果达到最大值，从随机数重新开始）
        int sequenceNum;
        if (SEQUENCE.get() >= MAX_SEQUENCE) {
            sequenceNum = RANDOM.nextInt(10000000); // 0-9999999
        } else {
            sequenceNum = SEQUENCE.incrementAndGet();
        }

        // 格式化序列号
        String sequenceStr = String.format(SEQUENCE_FORMAT, sequenceNum);

        // 组合订单编号
        return ORDER_PREFIX + now.format(DATE_TIME_FORMATTER) + sequenceStr;
    }

    /**
     * 生成订单编号（带业务类型）
     * @param businessType 业务类型
     * @return 订单编号，格式：OD + 业务类型 + 日期时间(12位) + 序列号(8位)
     */
    public static String generateOrderNo(String businessType) {
        return generateOrderNo() + businessType;
    }

    /**
     * 验证订单编号格式是否正确
     * @param orderNo 订单编号
     * @return 是否有效
     */
    public static boolean isValidOrderNo(String orderNo) {
        if (orderNo == null || orderNo.length() != 22) {
            return false;
        }

        // 检查前缀
        if (!orderNo.startsWith(ORDER_PREFIX)) {
            return false;
        }

        // 检查日期时间部分（12位数字）
        String dateTimePart = orderNo.substring(2, 14);
        if (!dateTimePart.matches("\\d{12}")) {
            return false;
        }

        // 检查序列号部分（8位数字）
        String sequencePart = orderNo.substring(14);
        return sequencePart.matches("\\d{8}");
    }

    /**
     * 从订单编号中提取生成时间
     * @param orderNo 订单编号
     * @return 生成时间，格式：yyyy-MM-dd HH:mm
     */
    public static String getGenerateTime(String orderNo) {
        if (!isValidOrderNo(orderNo)) {
            throw new IllegalArgumentException("无效的订单编号格式");
        }

        String dateTimeStr = orderNo.substring(2, 14);
        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr,
                DateTimeFormatter.ofPattern("yyyyMMddHHmm"));

        return dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
    }

    /**
     * 批量生成订单编号（测试用）
     * @param count 生成数量
     * @return 订单编号数组
     */
    public static String[] generateBatchOrderNos(int count) {
        if (count <= 0 || count > 1000) {
            throw new IllegalArgumentException("生成数量必须在1-1000之间");
        }

        String[] orderNos = new String[count];
        for (int i = 0; i < count; i++) {
            orderNos[i] = generateOrderNo();
            // 添加微小延迟避免重复
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                break;
            }
        }
        return orderNos;
    }
}